﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _003_类的定义与声明
{
    class Vector3
    {
        //我们定义了一个构造函数，那么编译器不会为我们提供构造函数了；
        public Vector3()
        {
            Console.WriteLine("Vector3的构造函数被调用了");
        }
        public Vector3(float x,float y,float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
            length = Length();
        }
        //编程规范上，习惯吧所有的字段，设置为private，只有在类内部访问，不可以通过对象访问
        private float x,y,z,length;

        private int age;
        private string name;

        //标准形式
        /*public String Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }*/

        //简写形式
        public string Name { get; set; }//编译器会自动给我们提供一个字段，来存储值
        public int Age//可以通过属性来给传过来的参设置条件
        {
            //属性可以通过只提供一个set或者get来设置属性的只写和只读
            set
            {
                if (age >= 0)
                {
                    age = value;
                }
            }
        }
        public float X//也可以叫做get，set方法
        {
            set
            {
                x = value;
            }
            get
            {
                return x;
            }
        }

        //为字段提供set方法，来设置字段的值
        public void SetX(float x)
        {
            //如果我们直接在方法内部访问同名的变量的时候，有限访问最近的参数（形参）
            //我们可以通过this.变量名来便是访问的是类的字段或者方法
            this.x = x;
        }
        
        public void SetY(float y)
        {
            this.y = y;
        }

        public void SetZ(float z)
        {
            this.z = z;
        }

        public float Length()
        {
            return (float)Math.Sqrt(x * x + y * y + z * z);//求向量长度的公式：（x的平方加y的平方）开根号
        }
        //定义属性
        public int MyIntProperty
        {
            //如果没有set块，就不能通过属性设置值了
            set
            {
                Console.WriteLine("属性中set块被调用");
                //我们可以在set块中通过value访问到设置的值
                Console.WriteLine("在set块中访问value的值是：" + value);
            }
            //如果没有get块，就不能通过属性取值了
            get
            {
                Console.WriteLine("属性中get块被调用");
                return 100;
            }
        }
        
    }
}
